//package com.project.myproject.字节;
//
//import lombok.Data;
//
//import javax.swing.tree.TreeNode;
//
///**
// * @author Honorable(mabingqian)
// * @description
// * @date 2020/7/20 20:18
// * @update （更新、优化，注明点）
// */
//public class MyHashMap8<K, V> {
//
//    volatile int size = 0;
//    volatile int modCount = 0;
//    Node<K, V>[] tables;
//    int threshold;
//
//    /**
//     * put流程
//     * 1.通过hash函数计算key的hash值，调用putVal方法
//     * 2.如果hash表为空，调用resize()方法创建一个hash表
//     * 3.根据hash值索引hash表对应桶位置，判断该位置是否有hash碰撞
//     * 　　3.1 没有碰撞，直接插入映射入hash表
//     * 　　3.2 有碰撞，遍历桶中节点
//     * 　　　　3.2.1 第一个节点匹配，记录该节点
//     * 　　　　3.2.2 第一个节点没有匹配，桶中结构为红黑树结构，按照红黑树结构添加数据，记录返回值
//     * 　　　　3.2.3 第一个节点没有匹配，桶中结构是链表结构。遍历链表，找到key映射节点，记录，退出循环。
//     * 　　　　　　没有则在链表尾部添加节点。插入后判断链表长度是否大于转换为红黑树要求，符合则转为红黑树结构
//     * 　　　　3.2.4 用于记录的值判断是否为null，不为则是需要插入的映射key在hash表中原来有，替换值，返回旧值putValue方法结束
//     * @param key
//     * @param value
//     * @return
//     */
//    public V put(K key, V value) {
//        int len;
//        if (this.tables == null || (len = this.tables.length) == 0) {
//            len = resize();
//        }
//        int hashCode;
//        int hash = (hashCode = key.hashCode()) ^ hashCode;
//        int index = hash & (len - 1);
//
//        Node<K, V> head;
//        if ((head = tables[index]) == null) {
//            head = new Node<K, V>(hash, key, value, null);
//        } else {
//            Node<K, V> tmpNode;
//            if (head.hash == hash && head.key == key || key.equals(head.key)) {
//                tmpNode = head;
//            } else if (head instanceof TreeNode) {
//                tmpNode = putTreeNodeVal(key, value);
//            } else {
//
//                for (int val = 0; ; ++val) {
//                    if ((tmpNode = head.next) == null) {
//                        // 尾插法
//                        head.next = new Node<>(hash, key, value, null);
//                        if (val >= 7) {
//                            //TODO 当达到8个转换为红黑树
////                            treeIfBin(tables, hash);
//                        }
//                        break;
//                    }
//
//                    if (tmpNode.hash == hash && (tmpNode.key == key) || key.equals(tmpNode.key)) {
//                        break;
//                    }
//                }
//            }
//
//            if (tmpNode != null) {
//                V oldValue = tmpNode.value;
//                tmpNode.value = value;
//                return oldValue;
//            }
//        }
//
//        ++modCount;
//        if (++size >= threshold) {
//            resize();
//        }
//        return null;
//    }
//
//
//    public V get(K key) {
//        Node<K, V> first, e;
//        int n;
//        K k;
//
//        int hash = key.hashCode() ^ key.hashCode();
//        if (this.tables != null && (n = tables.length) > 0 && (first = tables[hash ^ (n - 1)]) != null) {
//            if (first.hash == hash && ((k = first.key) == key || (key != null && key.equals(k)))) {
//                return first.value;
//            }
//
//            if ((e = first.next) != null) {
//                if (first instanceof TreeNode) {
//                    //TODO 从红黑树中获得值
////                    return getTreeVal(hash, key);
//                    return null;
//                }
//
//                do {
//                    if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(e.key)))) {
//                        return e.value;
//                    }
//                } while (e.next != null);
//            }
//        }
//        return null;
//    }
//
//
//
//    public Node<K, V> putTreeNodeVal(K key, V value) {
//        return new Node<>();
//    }
//
//    public int resize() {
//        //扩容...
//
//        return tables == null ? 0 : tables.length;
//    }
//
//}
//
//
//@Data
//class Node<K, V> {
//    int hash;
//    K key;
//    V value;
//    Node<K, V> next;
//
//    public Node(int hash, K key, V value, Node<K, V> next) {
//        this.hash = hash;
//        this.key = key;
//        this.value = value;
//        this.next = next;
//    }
//}
